/**
 * @file    app_airbag_system.c
 * @author  yhy
 * @brief   气袋通用接口源文件
 * @version 1.04
 * @date    2025-07-30
 *
 * @copyright Copyright (c) 2025
 *
 * @details
 * Change Logs:
 * Date           Author       Notes
 * 2025-07-30     yhy          the first version V1.00
 * 2025-10-22     yhy          修复了system_callbacks被覆盖的问题 V1.01
 * 2025-10-27     yhy          新增气袋气压阈值保护监测 V1.02
 * 2025-11-03     yhy          - 修改了气泵控制逻辑，将气泵独立，设置气袋状态时不必修改气泵
 *                             - 新增阀门仲裁，根据气泵状态仲裁抽气状态 V1.03
 * 2025-11-12     yhy          修复与按摩的冲突，当按摩开启时，不启用电磁阀仲裁 V1.04
 *
 */
#ifndef __APP_AIRBAG_SYSTEM_H__
#define __APP_AIRBAG_SYSTEM_H__

#include "inf_airbag.h"
#include "inf_cps121.h"

/**
 * @brief 通用模式枚举
 *
 */
typedef enum
{
    GENERAL_MODE_KEEP = 0U, /*!< 保压 */
} general_mode_e;

/**
 * @brief 气袋系统类型
 *
 */
typedef enum
{
    AIRBAG_SYSTEM_TYPE_HIP    = 0U, /*!< 臀部系统 */
    AIRBAG_SYSTEM_TYPE_THIGH  = 1U, /*!< 腿部系统 */
    AIRBAG_SYSTEM_TYPE_FLANK  = 2U, /*!< 侧翼系统 */
    AIRBAG_SYSTEM_TYPE_LUMBAR = 3U, /*!< 腰部系统 */
    AIRBAG_SYSTEM_TYPE_ALL    = 4U, /*!< 全气袋系统 */
    AIRBAG_SYSTEM_TYPE_MAX,
} airbag_system_type_e;

/**
 * @brief 气袋系统状态
 *
 */
typedef enum
{
    AIRBAG_SYSTEM_STATE_IDLE    = 0U, /*!< 空闲状态 */
    AIRBAG_SYSTEM_STATE_RUNNING = 1U, /*!< 运行状态 */
} airbag_system_state_e;

/**
 * @brief 气袋阀门配置, 用于配置气袋的阀门参数，因为每个子系统阀门数量不定, 故用此结构体解决
 *
 */
typedef struct
{
    solenoid_valve_channel_e inflate_valve_ch;    /*!< 充气阀门通道 */
    solenoid_valve_channel_e deflate_valve_ch;    /*!< 泄气阀门通道 */
    cps121_idx_e             pressure_sensor_idx; /*!< 关联的压力传感器索引 */
} airbag_valve_config_t;

/**
 * @brief 气动系统配置
 *
 */
typedef struct
{
    airbag_valve_config_t *valve_configs;          /*!< 气袋阀门配置 */
    uint8_t                airbag_count;           /*!< 气袋数量 */
    uint32_t               max_inflate_time_ms;    /*!< 最大充气时间 */
    uint32_t               dispatching_cycle_ms;   /*!< 调度周期, 用于气袋充气时间的增减 */
    uint16_t               air_pressure_threshold; /*!< 气压保护阈值(kPa) */
} airbag_system_config_t;

/**
 * @brief 气动通用系统结构
 *
 */
typedef struct
{
    bool                   initialized;            /*!< 系统是否初始化 */
    uint16_t               air_pressure_threshold; /*!< 气压保护阈值(kPa) */
    airbag_t              *airbags;                /*!< 气袋数组 */
    uint8_t                airbag_count;           /*!< 气袋数量 */
    cps121_idx_e          *sensor_mapping;         /*!< 传感器索引映射数组 */
    uint32_t               mode;                   /*!< 当前模式 */
    airbag_system_state_e  system_state;           /*!< 系统状态 */
    airbag_system_type_e   system_type;            /*!< 系统类型 */
    airbag_system_config_t config;                 /*!< 系统配置 */
} airbag_system_t;

/**
 * @brief 模式应用回调函数类型
 * @param system    系统指针
 * @param mode      要应用的模式
 */
typedef void (*airbag_system_mode_apply_cb_f)(airbag_system_t *system, uint32_t mode);

/**
 * @brief 模式验证回调函数类型
 * @param   mode      要验证的模式
 * @return  result_e  验证结果
 */
typedef result_e (*airbag_system_mode_validate_cb_f)(uint32_t mode);

/**
 * @brief 气袋系统回调函数集合
 *
 */
typedef struct
{
    airbag_system_mode_apply_cb_f    apply_mode;    /*!< 模式应用回调函数 */
    airbag_system_mode_validate_cb_f validate_mode; /*!< 模式验证回调函数 */
} airbag_system_callbacks_t;

result_e       app_airbag_system_init(airbag_system_t *system, const airbag_system_config_t *config,
                                      airbag_system_type_e type, const airbag_system_callbacks_t *callbacks);
result_e       app_airbag_system_set_mode(airbag_system_t *system, uint32_t mode);
result_e       app_airbag_system_stop(airbag_system_t *system);
void           app_airbag_system_handle(airbag_system_t *system);
uint32_t       app_airbag_system_get_mode(const airbag_system_t *system);
airbag_state_e app_airbag_system_get_airbag_state(const airbag_system_t *system, uint32_t airbag_idx);
void     app_airbag_system_ctrl_airbag(airbag_system_t *system, uint32_t airbag_idx, airbag_state_e state);
uint32_t app_airbag_system_get_air_pressure(const airbag_system_t *system, uint32_t airbag_idx);
void     app_airbag_system_pump_valve_coordination(void);

#endif
